[R3 复现]Neon Deceit
反调试+迷宫+无用数据+无限循环+函数名异常
main 函数就只是一个 helloworld 然后退出,但是 exit 用来混淆逻辑,动调的时候需要把exit给 nop 掉,真正的主要逻辑在下面的sub_18597 中。

跟进后发现伪代码逻辑不全,发现是_verrx混淆逻辑导致输出不全

把_verrx nop 掉重新分析函数,发现有反调试。先将一个加密过的字符串和 0x5A 进行异或,发现是一些 linux 常用调试器/反编译器的名称,分析这是一个基于名称查找的反调试,下面的cimag函数实际是退出函数。

这里也是反调试的一环是一个无限循环,这个无限循环在逻辑中出现多次,调试的时候请务必多加小心


启动调试绕过反调试,经过输入之后,我们会这里的逻辑,其中 var_6980 存放着迷宫地图,var_6970 是存放着输入字符长度的地方,var_6968是var_6970/2可能要进行什么操作

迷宫地图:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 
 | #################################################### #                 # # #
 # ##### ### # # # ####### # # # ####### # ### # # #
 #     # # # # # # #           # #     # #   #     #
 # ### ### # # # ########### # # # # # ########### #
 #   # #     # # # #   # # # # # # # #             #
 # # # # # # # ### # # # # # ##### # # ### ##### # #
 # # # # # # #       # # #   #   # # # #     #   # #
 # # ### # # # # ##### # ### # ########### ####### #
 # #   # # # # # #     #   # # # # # # # # # # # # #
 ######################### # # # # # # # # # # # # #
 #                               #             # # #
 ####### ############# ##### # # # ### # ### ### # #
 #             #         #   # # # #   #   #     # #
 # # # # # ############# ###########################
 # # # # # #                                       #
 # ### # # # # ### # # # # # # # # # # ### ### ### #
 #   # # # # #   # # # # # # # # # # #   #   # #   #
 # # ##### # # # # ##### # # # # # ### # # # # # # #
 # #     # # # # # #     # # # # #   # # # # # # #
 ###################################################
 
 | 
整理后的地图及其路线和键盘输入:ffffffffffffd7d5556aa97d7ffffffffffffd57
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 
 | ███████████████████████████████████████████████████dddddddddddddddddddddddddd█ █                 █ █ █
 █ █████ ███ █ █ █ ███████s█ █ █ ███████ █ ███ █ █ █
 █     █ █ █ █ █ █ █      sdd  █ █     █ █   █     █
 █ ███ ███ █ █ █ ███████████s█ █ █ █ █ ███████████ █
 █   █ █     █ █ █ █   █ █ █s█ █ █ █ █             █
 █ █ █ █ █ █ █ ███ █ █ █ █ █s█████ █ █ ███ █████ █ █
 █ █ █ █ █ █ █       █ █ █  s█   █ █ █ █     █   █ █
 █ █ ███ █ █ █ █ █████ █ ███s█ ███████████ ███████ █
 █ █   █ █ █ █ █ █     █   █s█ █ █ █ █ █ █ █ █ █ █ █
 █████████████████████████ █s█ █ █ █ █ █ █ █ █ █ █ █
 █                    aaaaaas    █             █ █ █
 ███████ █████████████s█████ █ █ █ ███ █ ███ ███ █ █
 █             █      sdd█   █ █ █ █   █   █     █ █
 █ █ █ █ █ █████████████s███████████████████████████
 █ █ █ █ █ █            sdddddddddddddddddddddddddd█
 █ ███ █ █ █ █ ███ █ █ █ █ █ █ █ █ █ █ ███ ███ ███s█
 █   █ █ █ █ █   █ █ █ █ █ █ █ █ █ █ █   █   █ █  s█
 █ █ █████ █ █ █ █ █████ █ █ █ █ █ ███ █ █ █ █ █ █s█
 █ █     █ █ █ █ █ █     █ █ █ █ █   █ █ █ █ █ █ █sd
 ███████████████████████████████████████████████████
 
 | 
经过调试我们可以知道下图左半部分是 flag 输出部分,右半部分是迷宫校验部分,
校验逻辑是带入的每个字节被拆分成 4 个 2 位 bit,按大端序排列,每个 2 位 bit 控制迷宫走向,00 为 w,01 为 s,10 为 a,11 为 d,var_6938 为当前 Y 轴,var_6938+4 为当前 X 轴
左半部分是校验部分

把刚才的正确迷宫路线的字母带换成二进制的硬编码然后转换成 16 进制:ffffffffffffd7d5556aa97d7ffffffffffffd57
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 
 | direction_str = "dddddddddddddddddddddddddssddssssssssaaaaaassddssddddddddddddddddddddddddddssssd"direction_map = {
 'd': '11',
 'w': '00',
 's': '01',
 'a': '10'
 }
 binary_str = ''.join(direction_map[ch] for ch in direction_str)
 byte_list = [binary_str[i:i+8].ljust(8, '0') for i in range(0, len(binary_str), 8)]
 hex_str = ''.join(f"{int(b, 2):02x}" for b in byte_list)
 print(hex_str)
 
 |